package estadistec.grafico;

import javax.swing.*;
import javax.swing.BorderFactory;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;

import java.awt.event.*;

import estadistec.logica.parser.Parser;
import estadistec.logica.parser.ParseException;
import estadistec.excepciones.Excepcion;
import estadistec.logica.tipos.TipoValor;

/**
 * Clase encargada de la solicitud de los datos para crear un nuevo atributo
 * solicita los datos(nombre, tipo, formula), evalua los datos y se encarga tanto de la creacion
 * atributo  grafico como la  invocacion para crear el atributo a nivel logico.
 */

public class AtributosVentana 
	extends JInternalFrame 
	implements ConstantesGraficas, ActionListener, MouseListener, 
			   KeyListener
{
	/*
	 * declaracion de componentes graficos
	 */
	
	/**
	 * panel en el cual se agregaran todos los componentes graficos.
	 **/
	private JPanel _panelPrincipal;
	
	/**
	 * campo de texto para obtener el nombre del atributo*/
	private JTextField _campoTxtNombre; 

	/**
	 * campo de texto para formula atributo*/
	private JTextField _campoTxtFormula; 
	
	/**
	 * check para activar formula  si se desea o no poner una formula al atributo
	 **/
	private JCheckBox _checkBoxActivarFormula;
	
	/**
	 * etiqueta para el campo de texto del nombre 
	 **/
	private JLabel _etiquetaNombre; 
	
	/**
	 * etiqueta para el tipo de atributo( cuantitativo - cualitativo )
	 */
	private JLabel _etiquetaTipo;
	
	/**
	 * etiqueta  para el numero de decimales a mostrar en un atributo.
	 **/
	private JLabel _etiquetaNumeroDecimales;
	
	/**
	 * etiqueta para el espacio muestral*/
	private JLabel _etiquetaEspacioMuestral;
	
	/**
	 * tipo de atributo cualitativo*/
	private JRadioButton _radioBotonCualitativo; 
	
	/**
	 * tipo de atributo cuantitativo*/
	private JRadioButton _radioBotonCuantitativo;
	
	/**
	 * etiqueta que se activara si el nombre esta repetido */
	private JLabel _etiquetaNombreRepetido;
	
	/**
	 * etiqueta que se activara si el nombre  cumple con las condiciones de formato y no esta repetido */
	private JLabel  _etiquetaNombreBien; 

	/**
	 * etiqueta que se activara si el nombre  incumple con el formato establecido */
	private JLabel  _etiquetaNombreIncorrecto; 
	
	/**
	 * boton  para solicitar que se abra la opcion de ayuda */
	private JButton  _botonIndicadorAyuda;

	/**
	 * boton cancelar  la creacion de un nuevo atributo*/
	private JButton _botonCancelar;
	
	/**
	 * boton  para solicitar que se abra la opcion de ayuda*/
	private JButton _botonAceptar;
	
	/**
	 *  boton para verificar que la formula cumpla con el formato correcto */
	private JButton  _botonVerificar; 
	
	/**
	 * combo para seleccionar el numero de decimales a usar*/
	private JComboBox  _comBoxListaDecimales;  
	
	/**
	 * combo para ingresar la lista de  datos del espacio muestral */
	private JComboBox _comBoxEspacioMuestral; 
	
	/**
	 * panel  con los componentes para solictar y verificar la formula
	 */
	private JPanel _panelFormula;
	
	/**
	 * tipo cuantivativo entero 
	 **/
	private JRadioButton _radioBotonEntero;
	
	/**
	 * tipo cuantivativo  flotante con  decimales  a mostrar de 0 - 6 
	 **/
	private JRadioButton _radioBotonFlotante;
	
	/**
	 * tipo cuantivativo  intervalo para cada una de las celdas  
	 **/
	private JRadioButton _radioBotonIntervalo;
	
	/**
	 * tipo cuantivativo booleano 
	 **/
	private JRadioButton _radioBotonBooleano;
	
	/**
	 * Indicador de si se desea ingresar formula
	 **/
	 private boolean _tieneFormula;
	
	 /**
	  * Nombre del atributo el cual es valido solo si cumple con el formato 
	  * establecido para nombres.
	  **/
	 private String _nombre;
	 
	 /**
	  * Formula para calcular el valor del atributo, es validada para ver si su formato es correcto.
	  **/
	 private String _strFormula;
	 
	 /**
	  * Entero  que nos indica si el atributo es cuantitativo (True) o cualitativo (False).
	  **/
	 private boolean _esCuantitativo;
	 
	 /**
	  * Cantidad de decimales a mostrar en caso de sea cuantitativo flotante.
	  **/
	 private int _noDecimales;
	 
	 /** 
	  * Listado de los objetos del espacio muestral en caso de atributos 
	  * cualitativos o listado de intervalos para cada atributo.
	  **/
	 private String[] _espacioMuestral; 
	 
	 /** 
	  * Bandera que guarda informacion sobre la validez del nombre.
	  */
	 private boolean _nombreEsValido;
	
	 /** 
	  * Bandera que guarda informacion sobre la validez de la formula.
	  */
	 private boolean _formulaEsValida;
	
	 /**
	  * Instancia de la clase tabla para establecer la relacion (tabla- 
	  * ventana atributos).
	  **/
	 private GTabla _gTabla;

	 /** 
	  * Parseador para la fórmula.
	  */
	 private Parser _formula;

	 /***
	  * campo de texto para el tipo
	  */
	  private JLabel  _tipoAtributo;
	
	
	 /** 
	  * Constructor.
	  */
	public AtributosVentana(GTabla gTabla)
	{

		super("Nuevo atributo");
	
		this._gTabla = gTabla;
		this._tieneFormula = false;
		
		/*
		 * Cargar las dimensiones, color y posicion de los componentes 
		 * graficos.
		 */
		
		this._panelPrincipal = new JPanel();
		this._panelPrincipal.setBorder(BorderFactory.createTitledBorder(" "));
		this._panelPrincipal.setLocation(CONFIG.cargarPunto("ORIGEN"));
		this._panelPrincipal.setSize(CONFIG.cargarDimension("VENTANA_ATRIBUTOS"));
		this._panelPrincipal.setVisible(true);
		this._panelPrincipal.setBackground(ESTILO.getPrimary3());
		
		this._etiquetaNombre = new JLabel();
		this._etiquetaNombre.setLocation(CONFIG.cargarPunto("ETIQUETA_NOMBRE"));
		this._etiquetaNombre.setSize(CONFIG.cargarDimension("ETIQUETA"));
		this._etiquetaNombre.setText("Nombre");
		this._etiquetaNombre.setVisible(true);
		
		this._campoTxtNombre = new JTextField();
		this._campoTxtNombre.setLocation(CONFIG.cargarPunto("NOMBRE_ATRIBUTO"));
		this._campoTxtNombre.setSize(CONFIG.cargarDimension("NOMBRE_ATRIBUTO"));
		this._campoTxtNombre.setText("");
		this._campoTxtNombre.setVisible(true);
		this._campoTxtNombre.setBackground(ESTILO.getWhite());
		this._campoTxtNombre.addKeyListener(this);
		
		this._etiquetaTipo = new JLabel();
		this._etiquetaTipo.setLocation(CONFIG.cargarPunto("ETIQUETA_TIPO"));
		this._etiquetaTipo.setSize(CONFIG.cargarDimension("ETIQUETA"));
		this._etiquetaTipo.setText("Tipo");
		this._etiquetaTipo.setVisible(true);
		
		this._radioBotonCualitativo = new JRadioButton();
		this._radioBotonCualitativo.setLocation(CONFIG.cargarPunto("TIPO_CUALITATIVO"));
		this._radioBotonCualitativo.setSize(CONFIG.cargarDimension("TIPO_CUALITATIVO"));
		this._radioBotonCualitativo.setText("Cualitativo");
		this._radioBotonCualitativo.setVisible(true);
		this._radioBotonCualitativo.setBorder(null);
		this._radioBotonCualitativo.setBackground(ESTILO.getWhite());
		this._radioBotonCualitativo.addActionListener(this);
		
		this._radioBotonCuantitativo = new JRadioButton();
		this._radioBotonCuantitativo.setLocation(CONFIG.cargarPunto("TIPO_CUANTITATIVO"));
		this._radioBotonCuantitativo.setSize(CONFIG.cargarDimension("TIPO_CUALITATIVO"));
		this._radioBotonCuantitativo.setText("Cuantitativo");
		this._radioBotonCuantitativo.setVisible(true);
		this._radioBotonCuantitativo.setBorder(null);
		this._radioBotonCuantitativo.setBackground(ESTILO.getWhite());
		this._radioBotonCuantitativo.addActionListener(this);
		this._radioBotonCuantitativo.setSelected(true);
		
		this._etiquetaNombreBien =  new JLabel(new ImageIcon(IMAGENESBOTONES[0]));
		this._etiquetaNombreBien.setLocation(CONFIG.cargarPunto("INDICADOR_NOMBRE1"));
		this._etiquetaNombreBien.setSize(CONFIG.cargarDimension("BOTON_HERRAMIENTA"));
		this._etiquetaNombreBien.setVisible(true);
		this._etiquetaNombreBien.setBorder(null);
		this._etiquetaNombreBien.setBackground(ESTILO.getWhite());
		
		this._etiquetaNombreRepetido =  new JLabel(new ImageIcon(IMAGENESBOTONES[1]));
		this._etiquetaNombreRepetido.setLocation(CONFIG.cargarPunto("INDICADOR_NOMBRE2"));
		this._etiquetaNombreRepetido.setSize(CONFIG.cargarDimension("BOTON_HERRAMIENTA"));
		this._etiquetaNombreRepetido.setVisible(true);
		this._etiquetaNombreRepetido.setBorder(null);
		this._etiquetaNombreRepetido.setBackground(ESTILO.getWhite());

		this._etiquetaNombreIncorrecto =  new JLabel(new ImageIcon(IMAGENESBOTONES[2]));
		this._etiquetaNombreIncorrecto.setLocation(CONFIG.cargarPunto("INDICADOR_NOMBRE3"));
		this._etiquetaNombreIncorrecto.setSize(CONFIG.cargarDimension("BOTON_HERRAMIENTA"));
		this._etiquetaNombreIncorrecto.setVisible(true);
		this._etiquetaNombreIncorrecto.setBorder(null);
		this._etiquetaNombreIncorrecto.setBackground(ESTILO.getWhite());
		
		this._botonIndicadorAyuda =  new JButton(new ImageIcon(IMAGENESBOTONES[3]));
		this._botonIndicadorAyuda.setLocation(CONFIG.cargarPunto("INDICADOR_AYUDA"));
		this._botonIndicadorAyuda.setSize(CONFIG.cargarDimension("BOTON_HERRAMIENTA"));
		this._botonIndicadorAyuda.setVisible(true);
		this._botonIndicadorAyuda.setBorder(null);
		this._botonIndicadorAyuda.setBackground(ESTILO.getWhite());
		this._botonIndicadorAyuda.addActionListener(this);
					
		this._etiquetaNumeroDecimales= new JLabel();
		this._etiquetaNumeroDecimales.setLocation(CONFIG.cargarPunto("ET_NUMDECIMALES"));
		this._etiquetaNumeroDecimales.setSize(CONFIG.cargarDimension("ETIQUETA_L"));
		this._etiquetaNumeroDecimales.setText("Precisión");
		this._etiquetaNumeroDecimales.setVisible(true);
		
		this._etiquetaEspacioMuestral= new JLabel();
		this._etiquetaEspacioMuestral.setLocation(CONFIG.cargarPunto("ET_NUMDECIMALES"));
		this._etiquetaEspacioMuestral.setSize(CONFIG.cargarDimension("ETIQUETA_L"));
		this._etiquetaEspacioMuestral.setText("Espacio Muestral");
		this._etiquetaEspacioMuestral.setVisible(false);
	
		
		this._comBoxListaDecimales =  new JComboBox();
		this._comBoxListaDecimales.setLocation(CONFIG.cargarPunto("LISTA_DECIMALES"));
		this._comBoxListaDecimales.setSize(CONFIG.cargarDimension("LISTA_DECIMALES"));
		this._comBoxListaDecimales.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"0", "1","2","3","4","5","6"}));
		this._comBoxListaDecimales.setBackground(ESTILO.getWhite());
		this._comBoxListaDecimales.setVisible(true);
		this._comBoxListaDecimales.setEditable(false);
		
		
		this._comBoxEspacioMuestral = new JComboBox();
		this._comBoxEspacioMuestral.setLocation(CONFIG.cargarPunto("LISTA_DECIMALES"));
		this._comBoxEspacioMuestral.setSize(CONFIG.cargarDimension("ESPACIO_MUESTRAL"));
		this._comBoxEspacioMuestral.setModel(new javax.swing.DefaultComboBoxModel(new String[]{}));
		this._comBoxEspacioMuestral.setBackground(ESTILO.getWhite());
		this._comBoxEspacioMuestral.setVisible(false);
		this._comBoxEspacioMuestral.setEditable(true);  
		
		
		this._checkBoxActivarFormula= new JCheckBox();
		this._checkBoxActivarFormula.setLocation(CONFIG.cargarPunto("FORMULA"));
		this._checkBoxActivarFormula.setSize(CONFIG.cargarDimension("FORMULA"));
		this._checkBoxActivarFormula.setText("Fórmula");
		this._checkBoxActivarFormula.setVisible(true);
		this._checkBoxActivarFormula.setBorder(null);
		this._checkBoxActivarFormula.setBackground(ESTILO.getWhite());
		this._checkBoxActivarFormula.addActionListener(this);
		
		this._radioBotonFlotante = new JRadioButton();
		this._radioBotonFlotante.setLocation(140,80);
		this._radioBotonFlotante.setSize(CONFIG.cargarDimension("SUBTIPO"));
		this._radioBotonFlotante.setText("Flotante");
		this._radioBotonFlotante.setVisible(true);
		this._radioBotonFlotante.setBorder(null);
		this._radioBotonFlotante.setBackground(ESTILO.getWhite());
		this._radioBotonFlotante.addActionListener(this);
		this._radioBotonFlotante.setSelected(true);
		
		this._radioBotonEntero = new JRadioButton();
		this._radioBotonEntero.setLocation(70,80);
		this._radioBotonEntero.setSize(CONFIG.cargarDimension("SUBTIPO"));
		this._radioBotonEntero.setText("Entero");
		this._radioBotonEntero.setVisible(true);
		this._radioBotonEntero.setBorder(null);
		this._radioBotonEntero.setBackground(ESTILO.getWhite());
		this._radioBotonEntero.addActionListener(this);
		this._radioBotonEntero.setSelected(false);
		
	    this._radioBotonBooleano = new JRadioButton();
		this._radioBotonBooleano.setLocation(210,80);
		this._radioBotonBooleano.setSize(CONFIG.cargarDimension("SUBTIPO"));
		this._radioBotonBooleano.setText("Booleano");
		this._radioBotonBooleano.setVisible(true);
		this._radioBotonBooleano.setBorder(null);
		this._radioBotonBooleano.setBackground(ESTILO.getWhite());
		this._radioBotonBooleano.addActionListener(this);
		this._radioBotonBooleano.setSelected(false);
		
		
		this._radioBotonIntervalo = new JRadioButton();
		this._radioBotonIntervalo.setLocation(290,80);
		this._radioBotonIntervalo.setSize(CONFIG.cargarDimension("SUBTIPO"));
		this._radioBotonIntervalo.setText("Intervalo");
		this._radioBotonIntervalo.setVisible(true);
		this._radioBotonIntervalo.setBorder(null);
		this._radioBotonIntervalo.setBackground(ESTILO.getWhite());
		this._radioBotonIntervalo.addActionListener(this);
		this._radioBotonIntervalo.setSelected(false);

		this._tipoAtributo = new JLabel();
		this._tipoAtributo.setLocation(40,60);
		this._tipoAtributo.setSize(150, 20);
		this._tipoAtributo.setVisible(false);

		this._esCuantitativo = true;
		
		/* evento para agregar  elementos en el espacio muestral*/
		this._comBoxEspacioMuestral.addActionListener(new ActionListener() 
		{ 
		  /*
		   * registrar los valores ingresados en el espacio muestral
		   */
			public void actionPerformed(ActionEvent ae) {
			 
			  /*
			   * Comprobar si se ha agregado un elemento a combo y que no sea nulo.
			   */
			  if(ae.getActionCommand().equals("comboBoxChanged"))
	    	  {
	    		  System.out.println(ae.getActionCommand());
	    		  
	    		  if(_comBoxEspacioMuestral.getSelectedItem().toString().length()!= 0)
	    		  {
	    			  _comBoxEspacioMuestral.removeItem(_comBoxEspacioMuestral.getSelectedItem());
	    			  _comBoxEspacioMuestral.addItem(_comBoxEspacioMuestral.getSelectedItem()); 
	    		  }  
	    	   }
			}
		});
			
		
		this._botonCancelar =  new JButton("Cancelar");
		this._botonCancelar.setLocation(CONFIG.cargarPunto("CANCELAR_ATRIBUTO"));
		this._botonCancelar.setSize(CONFIG.cargarDimension("ACEPTAR_ATRIBUTO"));
		this._botonCancelar.setVisible(true);
		this._botonCancelar.setBackground(ESTILO.getWhite());
		this._botonCancelar.addActionListener(this);
		
		this._botonAceptar =  new JButton("Aceptar");
		this._botonAceptar.setLocation(CONFIG.cargarPunto("ACEPTAR_ATRIBUTO"));
		this._botonAceptar.setSize(CONFIG.cargarDimension("ACEPTAR_ATRIBUTO"));
		this._botonAceptar.setVisible(true);
		this._botonAceptar.setBackground(ESTILO.getWhite());
		this._botonAceptar.addActionListener(this);
		this._botonAceptar.setEnabled(false);
		
		
		this._panelFormula = new JPanel();
		this._panelFormula.setBorder(BorderFactory.createTitledBorder("formula"));
		this._panelFormula.setLocation(5,125);
		this._panelFormula.setSize(380,70);
		this._panelFormula.setBackground(ESTILO.getWhite());
		this._panelFormula.setVisible(false);
		
		this._campoTxtFormula= new JTextField();
		this._campoTxtFormula.setLocation(CONFIG.cargarPunto("FORMULA_ATRIBUTO"));
		this._campoTxtFormula.setSize(CONFIG.cargarDimension("ETIQUETA_L"));
		this._campoTxtFormula.setText("");
		this._campoTxtFormula.setVisible(true);
		this._campoTxtFormula.setBackground(ESTILO.getWhite());
		this._campoTxtNombre.addKeyListener(this);
		
		this._botonVerificar =  new JButton("Verificar");
		this._botonVerificar.setLocation(CONFIG.cargarPunto("VERIFICAR_FORMULA"));
		this._botonVerificar.setSize(CONFIG.cargarDimension("ACEPTAR_ATRIBUTO"));
		this._botonVerificar.setVisible(true);
		this._botonVerificar.setBackground(ESTILO.getWhite());
		this._botonVerificar.addActionListener(this);
		
		this._panelFormula.add(this._botonVerificar);
		this._panelFormula.add(this._campoTxtFormula);
		this._panelFormula.add(this._botonVerificar);
		
		this._panelPrincipal.setLayout(null);
		this._panelFormula.setLayout(null);
		
		this._panelPrincipal.add(this._etiquetaNombre);
		this._panelPrincipal.add(this._etiquetaTipo);
		this._panelPrincipal.add(this._checkBoxActivarFormula);
		this._panelPrincipal.add(this._etiquetaEspacioMuestral);
		this._panelPrincipal.add(this._etiquetaNumeroDecimales);
		this._panelPrincipal.add(this._comBoxEspacioMuestral);
		this._panelFormula.add(this._campoTxtFormula);
		this._panelPrincipal.add(this._radioBotonCualitativo);
		this._panelPrincipal.add(this._radioBotonCuantitativo);
		this._panelPrincipal.add(this._etiquetaNombreRepetido);
		this._panelPrincipal.add(this._etiquetaNombreBien);
		this._panelPrincipal.add(this._etiquetaNombreIncorrecto);
		this._panelPrincipal.add(this._botonIndicadorAyuda);
		this._panelPrincipal.add(this._botonAceptar);
		this._panelPrincipal.add(this._botonCancelar);
		this._panelPrincipal.add(this._campoTxtNombre);
		this._panelPrincipal.add(this._panelFormula);
		this._panelPrincipal.add(this._comBoxListaDecimales);
		this._panelPrincipal.add(this._radioBotonIntervalo);
		this._panelPrincipal.add(this._radioBotonEntero);
		this._panelPrincipal.add(this._radioBotonBooleano);
		this._panelPrincipal.add(this._radioBotonFlotante);
		this._panelPrincipal.add(this._tipoAtributo);
	
		this._panelPrincipal.setBackground(ESTILO.getWhite());
		this.add(this._panelPrincipal);
		this.setClosable(true);
		
	}
	
	/**
	 * Manejador de eventos de la ventana. 
	 *
	 * @todo Falta la ayuda para crear nuevos atributos
	 * se ha de crear una ventana que muestre como crear los atributos,
	 * asi como los formatos  tanto para el nombre como la formula.
	 */
	public void actionPerformed(ActionEvent ae)
    {
		// Boton de ayuda.
		if(ae.getSource() == this._botonIndicadorAyuda)
		{
			
		}
		
		/*
		 * mostrar  una lista para construir el espacio muestral
		 */
		else if(ae.getSource()== this._radioBotonCualitativo) 
		{
			/*definir el tipo del atributo */
			
			this._esCuantitativo = false;
			
			/* mostrar los componentes nesesarios */
			this._etiquetaNumeroDecimales.setVisible(false);
			this._comBoxListaDecimales.setVisible(false);
			
			this._comBoxEspacioMuestral.setVisible(true);
			this._etiquetaEspacioMuestral.setVisible(true);
			
			this._radioBotonCualitativo.setSelected(true);
			this._radioBotonCuantitativo.setSelected(false);
			
			this._radioBotonEntero.setVisible(false);
			this._radioBotonFlotante.setVisible(false);
			this._radioBotonIntervalo.setVisible(false);
			this._radioBotonBooleano.setVisible(false);
		}
		
		
		/*
		 * mostrar una lista con la cantidad de decimales a mostrar
		 */
		else if (ae.getSource()== this._radioBotonCuantitativo )
		{
			/*definir el tipo del atributo**/
			this._esCuantitativo = true;
			
			/*mostrar los componentes que sea nesesario*/
			this._etiquetaNumeroDecimales.setVisible(true);
			this._comBoxListaDecimales.setVisible(true);
			
			this._comBoxEspacioMuestral.setVisible(false);
			this._etiquetaEspacioMuestral.setVisible(false);
			
			this._radioBotonCualitativo.setSelected(false);
			this._radioBotonCuantitativo.setSelected(true);
			
			this._radioBotonEntero.setVisible(true);
			this._radioBotonFlotante.setVisible(true);
			this._radioBotonIntervalo.setVisible(true);
			this._radioBotonBooleano.setVisible(true);
		}
		
		
		// Se solicita la creacion del atributo.
		else if (ae.getSource()== this._botonAceptar) {
			this.solicitarCreacionAtributo();
			this.terminar();
		}
		
		/*
		 * Cancelar la deficicion de un nuevo atributo.
		 */
		else if (ae.getSource() == this._botonCancelar)
		{	     
				this.terminar();
		}
		
		/*
		 * activar la solicitud de datos de la formula
		 */
		else if (ae.getSource()== this._checkBoxActivarFormula)
		{
			if (this._checkBoxActivarFormula.isSelected() == true) {
			    this._botonAceptar.setEnabled(false);
				this._panelFormula.setVisible(true);
				this._tieneFormula = true;

				this._radioBotonBooleano.setVisible(false);
				this._radioBotonCualitativo.setVisible(false);
				this._radioBotonCuantitativo.setVisible(false);
				this._radioBotonEntero.setVisible(false);
				this._radioBotonFlotante.setVisible(false);
				this._radioBotonIntervalo.setVisible(false);
				this._radioBotonBooleano.setVisible(false);
				this._etiquetaNumeroDecimales.setVisible(false);
				this._comBoxListaDecimales.setVisible(false);
			}
			else 
			{
				if (this._nombreEsValido)
					this._botonAceptar.setEnabled(true);
				else
					this._botonAceptar.setEnabled(false);
				this._panelFormula.setVisible(false);
				this._tieneFormula = false;

				this._radioBotonBooleano.setVisible(true);
				this._radioBotonCualitativo.setVisible(true);
				this._radioBotonCuantitativo.setVisible(true);
				this._radioBotonEntero.setVisible(true);
				this._radioBotonFlotante.setVisible(true);
				this._radioBotonIntervalo.setVisible(true);
				this._radioBotonBooleano.setVisible(true);
				this._etiquetaNumeroDecimales.setVisible(true);
				this._comBoxListaDecimales.setVisible(true);
				
				this._tipoAtributo.setVisible(false);
			}
			this._formulaEsValida = false;
		}
		
		/*
		 *  evento para llamar al metodo el cual verificara  si la formula es correcta
		 */
		else if (ae.getSource()== this._botonVerificar)
		{ 
			this._formula = this._gTabla.nuevaFormula();
			TipoValor tipoFormula;
			try {
				this._formula.inicializar(this._campoTxtFormula.getText());
				tipoFormula = this._formula.getTipo();
			} catch (ParseException e) {
				JOptionPane.showMessageDialog(null,"Sintaxis de formula incorrecta.","Error",JOptionPane.WARNING_MESSAGE);
				return;
			} catch (Excepcion e) {
				JOptionPane.showMessageDialog(null,e.getMensaje(),"Error",JOptionPane.WARNING_MESSAGE);
				return;
			} catch (Exception e) {
				JOptionPane.showMessageDialog(null,"Error desconocido.","Error",JOptionPane.WARNING_MESSAGE);
				return;
			}
			this._etiquetaTipo.setVisible(true);
			this._tipoAtributo.setVisible(true);
			switch (tipoFormula) {
				case BOOLEANO :
					this._tipoAtributo.setText("Booleano");
					break;
				case ENTERO :
					this._tipoAtributo.setText("Entero");
					break;
				case FLOTANTE :
					this._tipoAtributo.setText("Flotante");
					this._etiquetaNumeroDecimales.setVisible(true);
					this._comBoxListaDecimales.setVisible(true);
					break;
				case INTERVALO :
					this._tipoAtributo.setText("intervalo");
					this._etiquetaNumeroDecimales.setVisible(true);
					this._comBoxListaDecimales.setVisible(true);
					break;
				case CUALITATIVO :
					this._tipoAtributo.setText("Cualitativo");
					break;
				default :
					assert(false);
			}
			this._strFormula = this._campoTxtFormula.getText();
			this._formulaEsValida = true;
			// Tanto la formula como el nombre son correctos.
			if (this._nombreEsValido == true)
				this._botonAceptar.setEnabled(true);
		}
		
		/*evento para declarar subtipo cuantitativo entero*/
		else if(ae.getSource() == this._radioBotonEntero)
		{
			this._etiquetaNumeroDecimales.setVisible(false);
			this._comBoxListaDecimales.setVisible(false);
			this._radioBotonEntero.setSelected(true);
			this._radioBotonFlotante.setSelected(false);
			this._radioBotonBooleano.setSelected(false);
			this._radioBotonIntervalo.setSelected(false);
		}
		
		/*evento para declarar subtipo cuantitativo flotante */
		else if(ae.getSource() == this._radioBotonFlotante)
		{
			this._etiquetaNumeroDecimales.setVisible(true);
			this._comBoxListaDecimales.setVisible(true);
			this._radioBotonEntero.setSelected(false);
			this._radioBotonFlotante.setSelected(true);
			this._radioBotonBooleano.setSelected(false);
			this._radioBotonIntervalo.setSelected(false);
		}

		/*evento para declarar subtipo cuantitativo  mediante intervalos*/
		else if(ae.getSource() == this._radioBotonIntervalo)
		{
			this._etiquetaNumeroDecimales.setVisible(false);
			this._comBoxListaDecimales.setVisible(false);
			this._radioBotonEntero.setSelected(false);
			this._radioBotonFlotante.setSelected(false);
			this._radioBotonBooleano.setSelected(false);
			this._radioBotonIntervalo.setSelected(true);
		}
		
		/*evento para declarar subtipo cuantitativo booleano*/
		else if(ae.getSource() == this._radioBotonBooleano)
		{
			this._etiquetaNumeroDecimales.setVisible(false);
			this._comBoxListaDecimales.setVisible(false);
			this._radioBotonEntero.setSelected(false);
			this._radioBotonFlotante.setSelected(false);
			this._radioBotonBooleano.setSelected(true);
			this._radioBotonIntervalo.setSelected(false);
		}

    }
	
	
	/*
     * Manejadores de eventos del mouse. Son obligatorios porque hereda
	 * de la clase MouseListener.
     */
    public void mouseDragged(MouseEvent e){}
    public void mouseMoved   (MouseEvent e){} 
    public void mouseReleased(MouseEvent e){}
    
    public void mousePressed (MouseEvent e){}
    public void mouseEntered (MouseEvent e){}
    public void mouseClicked (MouseEvent e){}
    
    
    /*
     * posicionarse sobre un componente
     */
    public void mouseExited(MouseEvent e) {    }


     /**
      * Evento para cuando se presiona una tecla.
      */
     public void keyPressed(KeyEvent k)      {     }
     

     /**
      * Evento para cuando se libera una tecla.
      */
     public void keyTyped(KeyEvent k)     {     }
     

     /**
      * Evento para cuando se utiliza una tecla. En cada tecla
	  * que se libera se verifica el nombre.
      */
     public void keyReleased(KeyEvent k)
     {
		 if (k.getSource() == this._campoTxtNombre)
			 this._verificarNombre();
		 else if (k.getSource() == this._campoTxtFormula) {
			 this._botonAceptar.setEnabled(false);
			 this._formulaEsValida = false;
		 }
     }
     

	/**
	 * Hace invisible la ventana
	 */
	public void terminar()
	{
		 this.setVisible(false);
	}
	
	/**
	 * Hace visible la ventana
	 */
	public void iniciar()
	{
	   this.setVisible(true);  
	}
	
 
     
     /**
      * Crear el atributo.
      */
     public void solicitarCreacionAtributo()
     {
		 assert(_nombreEsValido);
		 assert(!_tieneFormula || _formulaEsValida);
    	 	
		/*
		 * Dependiendo del tipo seleccionar las caracteristicas a mandar del tipo,
		 * para el caso en que no tiene formula.
		 */
    	 
		 // Si tiene formula, cancelamos. El proceso debe ser distinto.
		 if (this._tieneFormula)
		 {
			switch (this._formula.getTipo())
			{
				case BOOLEANO :
					this._gTabla.agregarAtributoBooleano(this._nombre,this._formula, this._strFormula);
					System.out.println("Tipo Booleano");
					break;
				case ENTERO :
					this._gTabla.agregarAtributoEntero(this._nombre,this._formula, this._strFormula);
					System.out.println("Tipo Entero");
					break;
				case FLOTANTE :
					this._noDecimales =
							Integer.parseInt(this._comBoxListaDecimales.getSelectedItem().toString());
					this._gTabla.agregarAtributoFlotante(this._nombre, this._noDecimales, this._formula, this._strFormula);
					System.out.println("Tipo Flotante");
					break;
				case INTERVALO :
					this._noDecimales =
							Integer.parseInt(this._comBoxListaDecimales.getSelectedItem().toString());
					this._gTabla.agregarAtributoIntervalo(this._nombre, this._noDecimales, this._formula, this._strFormula);
					System.out.println("Tipo Intervalo");
					break;
				case CUALITATIVO :
					this._gTabla.agregarAtributoCualitativo(this._nombre, this._formula, this._strFormula);
					System.out.println("Tipo Cualitativo");
					break;
				default :
					assert(false);
			}
			return;
		 }

		 // Cuantitativo, sin fórmula
		if(this._esCuantitativo)
		{
			// Definir si es booleano, entero, flotante o intervalo.
			if (this._radioBotonBooleano.isSelected())
				this._gTabla.agregarAtributoBooleano(this._nombre);
			else if (this._radioBotonEntero.isSelected())
				this._gTabla.agregarAtributoEntero(this._nombre);
			else {
				this._noDecimales = Integer.parseInt(
						this._comBoxListaDecimales.getSelectedItem().toString()
						);
				if (this._radioBotonIntervalo.isSelected())
					this._gTabla.agregarAtributoIntervalo(
							this._nombre, this._noDecimales);
				else
					this._gTabla.agregarAtributoFlotante(
							this._nombre, this._noDecimales);
			}
		}
		// Cualitativo sin fórmula
		else
		{  
			_espacioMuestral = new String[this._comBoxEspacioMuestral.getItemCount()];
			// Obteniendo el espacio muestra.
			for(int i = 0 ; i < this._espacioMuestral.length; i++)
				this._espacioMuestral[i] = 
					this._comBoxEspacioMuestral.getItemAt(i).toString();
			this._gTabla.agregarAtributoCualitativo(this._nombre, this._espacioMuestral);
		}
	 }

	 /** 
	  * Verifica que el nombre sea valido.
	  */
	 private void _verificarNombre() {
	 	 this._nombre = this._campoTxtNombre.getText();
 		 if (this._gTabla.verificarSintaxisNombre(this._nombre)) {
 			 if (this._gTabla.verificarNombreAtributoSinRepetir(this._nombre)) {
				 this._setLuzVerde();
				 this._nombreEsValido = true;
				 // No tiene formula; o si tiene, la formula es valida.
				 if (!this._tieneFormula || this._formulaEsValida)
					 this._botonAceptar.setEnabled(true);
			 }
			 else {
				 this._setLuzAmarilla();
				 this._botonAceptar.setEnabled(false);
				 this._nombreEsValido = false;
			 }
		 }
		 else {
			 this._setLuzRoja();
			 this._botonAceptar.setEnabled(false);
			 this._nombreEsValido = false;
		 }
	 }

	 /**
	  * El nombre está correcto.
	  */
	 private void _setLuzVerde() {
	 }

	 /**
	  * El nombre es correcto pero está repetido.
	  */
	 private void _setLuzAmarilla() {
	 }

	 /**
	  * El nombre es incorrecto.
	  */
	 private void _setLuzRoja() {
	 }
}
